home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2002 #11
/
Amiga Plus CD - 2002 - No. 11.iso
/
Tools
/
Development
/
Feelin021015
/
Libs
/
Feelin
/
Bar.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-10-28
|
7KB
|
262 lines
;/*
Avail Flush >NIL:
MakeClass Bar VER 1 REV 00 ;ASM
Quit
*/
///Header
#include <libraries/feelin.h>
#include <clib/utility_protos.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/graphics_protos.h>
#include <clib/feelin_protos.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/dos_pragmas.h>
#include <pragmas/graphics_pragmas.h>
#include <pragmas/utility_pragmas.h>
UBYTE FCC_Name[] = FC_Bar;
UBYTE FCC_ID[] = "$VER: FC_Bar 1.00 (11-06-00) by Olivier Laviale (lotan9@aol.com)";
struct Library *DOSBase,*GfxBase,*UtilityBase;
struct FeelinBase *FeelinBase;
struct LocalObjectData
{
STRPTR pcTitle;
STRPTR pcPreParse;
// struct FeelinTextDisplay TD;
APTR TD;
UWORD nFlags;
UWORD nReserved;
// FP_Xxx
ULONG nPref_PreParse;
};
#define FF_Bar_Vertical (1L << 00)
//+
/*** Methods ***************************************************************/
///Bar.New
ULONG SAVEDS bar_New(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,struct TagItem *Tags)
{
struct TagItem *item;
LOD -> nPref_PreParse = FP_Bar_PreParse;
if (F_SuperDoA(Class,Obj,FM_New,(ULONG *)Tags))
{
while (item = NextTagItem(&Tags))
{
switch (item -> ti_Tag)
{
case FA_Bar_Title: LOD -> pcTitle = (STRPTR)item -> ti_Data; break;
case FA_Bar_PreParse: LOD -> pcPreParse = (STRPTR)item -> ti_Data; break;
}
}
if (LOD -> pcTitle)
{
if (LOD -> TD = F_NewObjA(FC_TextDisplay,NULL))
{
F_Set(LOD -> TD,FA_TextDisplay_Contents,(ULONG)LOD -> pcTitle);
}
else
{
return NULL;
}
}
return (ULONG)Obj;
}
return NULL;
}
//+
///Bar.Dispose
ULONG SAVEDS bar_Dispose(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD)
{
LOD -> TD = (APTR) F_DisposeObj((APTR)LOD -> TD);
return F_SuperDoA(Class,Obj,FM_Dispose,NULL);
}
//+
///Bar.Get
ULONG SAVEDS bar_Get(struct LocalObjectData *LOD,struct TagItem *Tags)
{
struct TagItem *item;
ULONG *save;
while (item = NextTagItem(&Tags))
{
save = (ULONG *)item -> ti_Data;
switch (item -> ti_Tag)
{
case FA_Bar_Title: *save = (ULONG)LOD -> pcTitle; break;
case FA_Bar_PreParse: *save = (ULONG)LOD -> pcPreParse; break;
}
}
return NULL;
}
//+
///Bar.Setup
ULONG SAVEDS bar_Setup(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,ULONG *pnArgs)
{
ULONG data;
if (F_SuperDoA(Class,Obj,FM_Setup,pnArgs))
{
if (LOD -> TD)
{
data = (ULONG)"`l`Ss`Sh"; // Default
F_Do(_client(Obj),FM_Client_Resolve,(ULONG)LOD -> nPref_PreParse,(ULONG)&data);
LOD -> pcPreParse = (STRPTR)data;
F_Do(LOD -> TD,FM_Set,
FA_TextDisplay_PreParse, (ULONG)LOD -> pcPreParse,
FA_TextDisplay_Font, (ULONG)_font(Obj),
TAG_DONE);
}
return TRUE;
}
return FALSE;
}
//+
///Bar.Cleanup
ULONG SAVEDS bar_Cleanup(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,ULONG *pnArgs)
{
F_Do(LOD -> TD,FM_Set,
FA_Text_PreParse, NULL,
FA_TextDisplay_Font, NULL, TAG_DONE);
return F_SuperDoA(Class,Obj,FM_Cleanup,pnArgs);
}
//+
///Bar.AskMinMax
ULONG SAVEDS bar_AskMinMax(struct FeelinClass *Class,struct FeelinObject *Obj,struct LocalObjectData *LOD)
{
LOD -> nFlags = F_Get(Obj -> Parent,FA_Horizontal) ? LOD -> nFlags | FF_Bar_Vertical : LOD -> nFlags - (LOD ->nFlags & FF_Bar_Vertical);
if (LOD -> TD)
{
if ((LOD -> nFlags & FF_Bar_Vertical) == FALSE)
{
_minh(Obj) += ((struct FeelinTextDisplay *)(LOD -> TD)) -> nHeight;
}
}
else
{
if (LOD -> nFlags & FF_Bar_Vertical)
{
_minw(Obj) += 2;
_maxw(Obj) = _minw(Obj);
}
else
{
_minh(Obj) += 2;
_maxh(Obj) = _minh(Obj);
}
}
return F_SuperDoA(Class,Obj,FM_AskMinMax,NULL);
}
//+
///Bar.Draw
ULONG SAVEDS bar_Draw(struct FeelinClass *Class,APTR Obj,struct LocalObjectData *LOD,ULONG *pnArgs)
{
struct RastPort *rp;
struct FeelinTextDisplay *td;
struct FeelinRect rect;
ULONG dark,shine;
UWORD x1,y1,x2,y2,w,h, bw;
rp = _rp(Obj);
x1 = _x(Obj); w = _w(Obj); x2 = x1 + w - 1; dark = _pen(Obj,FV_Pen_Dark);
y1 = _y(Obj); h = _h(Obj); y2 = y1 + h - 1; shine = _pen(Obj,FV_Pen_Shine);
F_SuperDoA(Class,Obj,FM_Draw,pnArgs);
if (LOD -> nFlags & FF_Bar_Vertical)
{
if (w > 2) x1 = w / 2 + x1 - 1;
_APen(dark); _Move(x1,y1); _Draw(x1,y2);
_APen(shine); _Move(x1+1,y1); _Draw(x1+1,y2);
}
else
{
if (td = LOD -> TD)
{
rect.x1 = x1+10+1; rect.y1 = y1;
rect.x2 = x2-10-1; rect.y2 = y2;
if (F_Do(td,FM_TextDisplay_Size,&rect) == 0) goto __done;
bw = (w - 10 - td -> nWidth) / 2;
y1 = (h / 2) + y1;
_APen(shine); _Move(x1,y1); _Draw(x1+bw-1,y1); _Move(x2-bw+1,y1); _Draw(x2,y1);
_APen(dark); _Move(x1,y1-1); _Draw(x1+bw-1,y1-1); _Move(x2-bw+1,y1-1); _Draw(x2,y1-1);
rect.x1 = x1+bw+5; rect.x2 = x2-bw-5;
F_Do(td,FM_TextDisplay_Draw,&rect,_render(Obj));
}
else
{
__done:
if (h > 2) y1 = h / 2 + y1 - 1;
_APen(dark); _Move(x1,y1); _Draw(x2,y1);
_APen(shine); _Move(x1,y1+1); _Draw(x2,y1+1);
}
}
return NULL;
}
//+
/*** Class *****************************************************************/
///FCC_Dispatcher
ULONG SAVEDS ASM FCC_Dispatcher(REG_A2 struct FeelinClass *Class,REG_A0 APTR Obj,REG_D0 ULONG Method,REG_A1 ULONG *Args)
{
struct LocalObjectData *LOD = INST_DATA(Class,Obj);
switch (Method)
{
case FM_New: return bar_New (Class,Obj,LOD,(struct TagItem *)Args);
case FM_Dispose: return bar_Dispose (Class,Obj,LOD);
case FM_Get: F_SuperDoA (Class,Obj,Method,Args);
return bar_Get (LOD,(struct TagItem *)Args);
case FM_Setup: return bar_Setup (Class,Obj,LOD,Args);
case FM_Cleanup: return bar_Cleanup (Class,Obj,LOD,Args);
case FM_AskMinMax: return bar_AskMinMax (Class,Obj,LOD);
case FM_Draw: return bar_Draw (Class,Obj,LOD,Args);
default: return F_SuperDoA (Class,Obj,Method,Args);
}
}
//+
///FCC_Info
ULONG * SAVEDS ASM FCC_Info(REG_A0 struct FeelinBase *Feelin)
{
static ULONG Tags[] =
{
FA_SuperID, (ULONG)FC_Area,
FA_DataSize, sizeof(struct LocalObjectData),
FA_Dispatcher, (ULONG)FCC_Dispatcher,
TAG_DONE
};
FeelinBase = Feelin;
DOSBase = Feelin -> Dos;
GfxBase = Feelin -> Graphics;
UtilityBase = Feelin -> Utility;
return Tags;
}
//+